﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ControlsLib;
using GestionePolveriLib.BL;
using GestionePolveriLib.Facades;
using BrightIdeasSoftware;
using System.Security.Permissions;
using System.Collections;
using GestionePolveri2.Reports;
using GestionePolveriLib.BL.Reports;
using System.Transactions;
using GestionePolveri2.Filters;
using GestionePolveri2.DAL;
using FrameworkLib.Filters;
using FrameworkLib.Facades.Paging;
using GestionePolveriLib.BL.Filters;
using FrameworkLib.Utilities.Export;
using FrameworkLib.Configurations.FormsConfiguration;
using FrameworkLib.Configurations.FormsConfiguration.BL;

namespace GestionePolveri2
{
    //[PrincipalPermission(SecurityAction.Demand, Authenticated = true, Role = "Amministrazione")]
    public partial class Amministrazione2 : AmministrazioneBaseExt
    {
        private double m_totKg = 0;
        private double m_totEuro = 0;
        private TotaleAmministrazione m_totaleAmministrazione = null;
        private Dictionary<string, TotaleAmministrazione> m_totXFamiglia = null;
        private List<FamigliaColore> m_elencoFamiglie = null;
        private bool m_checkNumFattura = false;
        private LottiPagedFacade pf = null;
        private LottoFacade lf = null;

        public Amministrazione2()
        {
            InitializeComponent();
        }

        public override void InitializeForm()
        {
            System.Security.Principal.IPrincipal m_operatore = System.Threading.Thread.CurrentPrincipal;
            string[] roles = System.Web.Security.Roles.GetRolesForUser(m_operatore.Identity.Name);

            SavingConfigurationBag scb = new SavingConfigurationBag();
            scb.FormName = this.Name;
            scb.RoleName = roles[0];
            this.SavingConfigurationBag = scb;

            base.InitializeForm();

            SetupForm();
        }

        private void SetupForm()
        {
            if (!this.DesignMode)
            {
                this.ShowCNFGMenu = true;

                pf = new LottiPagedFacade(100);

                lf = new LottoFacade();

                this.CanModify = false;
                this.ShowOnlyCustomButton = true;

                this.ButtonClicked += new EventHandler<CustomEventArgs<Lotto>>(Anagrafica_ButtonClicked);
                this.CustomButtonClicked += new EventHandler<CustomEventArgs<Lotto>>(Amministrazione2_CustomButtonClicked);

                this.ItemSelected += new EventHandler<CustomEventArgs<Lotto>>(Anagrafica_ItemSelected);

                this.objectListView1.ItemChecked += new ItemCheckedEventHandler(objectListView1_ItemChecked);

                this.objectListView1.ItemCheck += new ItemCheckEventHandler(objectListView1_ItemCheck);

                this.objectListView1.CellEditFinishing += new CellEditEventHandler(objectListView1_CellEditFinishing);
                this.objectListView1.CellEditStarting += new CellEditEventHandler(objectListView1_CellEditStarting);

                m_totaleAmministrazione = new TotaleAmministrazione();
                m_totXFamiglia = new Dictionary<string, TotaleAmministrazione>();

                this.AddCustomButton("btnSalva", "Salva");
                this.AddCustomButton("btnExportToExcel", "Esporta in Excel");
                //this.AddCustomButton("btnSeleziona", "Seleziona");
                //this.AddCustomButton("btnDeseleziona", "Deseleziona");
                this.AddCustomButton("btnAnnullaAssociazione", "Annulla associazione");

                this.InitializeButtonBar();
                this.IsFiltering = true;

                InizializzaCampi();
            }

            RefreshColumns();
        }

        //[PrincipalPermission(SecurityAction.Demand, Authenticated = true, Role = "Amministrazione")]
        private void InizializzaCampi()
        {
            //this.splitContainer1.Panel2Collapsed = true;
            //LoadData(cf2.FilterBag);

            LoadFamiglie();

            this.ShowFilterTracing = true;

            //this.Filter = cf2;

            pf.Pager = this.Pager;
            this.Pager.PageChanged += new EventHandler<NavigationEventArgs>(Pager_PageChanged);
            this.Pager.InitializeControl();

            ManageData();
        }

        public override void OnFilterExecuted()
        {
            base.OnFilterExecuted();

            pf.GetNumberOfPages(this.Filter.FilterBag);

            ManageData();
        }

        public override void OnFilterReset()
        {
            base.OnFilterReset();

            ManageData();
        }

        void Pager_PageChanged(object sender, NavigationEventArgs e)
        {
            switch (e.NavigationEventType)
            {
                case NavigationEventType.First:
                    pf.First();
                    break;
                case NavigationEventType.Next:
                    pf.Next();
                    break;
                case NavigationEventType.Previous:
                    pf.Previous();
                    break;
                case NavigationEventType.Last:
                    pf.Last();
                    break;
                case NavigationEventType.GotToPosition:
                    pf.PageNumber = e.Position;
                    break;
                default:
                    break;
            }

            ManageData();
        }

        private void ManageData()
        {
            objectListView1.ClearObjects();
            LoadData(this.Filter.FilterBag);

            if (this.Filter.FilterBag.LoadingMode == LottoLoadingModes.NotAssociated ||
                this.Filter.FilterBag.LoadingMode == LottoLoadingModes.All)
            {
                this.dynDataFattura.Visible = true;
                this.dynNumFattura.Visible = true;
                this.lblDataFattura.Visible = true;
                this.lblNumFattura.Visible = true;
                this.dynDatiFattura.Visible = true;
            }

            if (this.Filter.FilterBag.LoadingMode == LottoLoadingModes.Associated)
            {
                this.dynDataFattura.Visible = false;
                this.dynNumFattura.Visible = false;
                this.lblDataFattura.Visible = false;
                this.lblNumFattura.Visible = false;
                this.dynDatiFattura.Visible = false;
            }

            //if (!this.IsFiltering)
            //{
            //    LoadData(false);
            //}
            //else
            //{
            //    LoadData(cf2.FilterBag);
            //}
        }

        void objectListView1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            e.NewValue = e.CurrentValue;

            Lotto m_lotto = (Lotto)((OLVListItem)this.objectListView1.Items[e.Index]).RowObject;

            if (m_lotto != null)
            {
                ////if (!string.IsNullOrWhiteSpace(m_lotto.NumFattura) && (m_lotto.DataFattura.HasValue))

                if (this.Filter.FilterBag.LoadingMode == LottoLoadingModes.Associated)
                {
                    if (m_lotto.PrezzoUnitario > 0) //&& (e.CurrentValue == CheckState.Unchecked))
                    {
                        e.NewValue = (e.CurrentValue == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked); // CheckState.Checked;
                    }
                }
                else
                {
                    if (m_lotto.PrezzoUnitario > 0)
                    {
                        e.NewValue = CheckState.Checked;
                    }
                    else
                    {
                        e.NewValue = CheckState.Unchecked;
                    }

                    if (m_lotto.PrezzoUnitario < 0)
                    {
                        ((Lotto)((OLVListItem)this.objectListView1.Items[e.Index]).RowObject).PrezzoUnitario = 0;

                        //MessageBox.Show("Valore indicato per il prezzo non corretto !");

                        this.objectListView1.RefreshItem((OLVListItem)this.objectListView1.Items[e.Index]);
                    }
                }
            }      
        }

        void objectListView1_ItemChecked(object sender, ItemCheckedEventArgs e)
        {
            Lotto m_lotto = ((Lotto)((OLVListItem)e.Item).RowObject);

            ClearTotali();

            foreach (Lotto l in this.objectListView1.CheckedObjects)
            {
                AggiornaTotali(l, true);
            }


            //if (e.Item.Checked == false)
            //{
            //    m_lotto.DataFattura = null;
            //    m_lotto.NumFattura = null;
            //    m_lotto.PrezzoUnitario = 0;
            //}

            //if (e.Item.Checked)
            //{
            //    if (cf2.FilterBag.LoadingMode == LottoLoadingModes.NotAssociated ||
            //        cf2.FilterBag.LoadingMode == LottoLoadingModes.All)
            //    {
            //        if (this.dynNumFattura.Text != string.Empty)
            //        {
            //            m_lotto.DataFattura = this.dynDataFattura.Value;
            //            m_lotto.NumFattura = this.dynNumFattura.Text;
            //        }
            //        else
            //        {
            //            m_lotto.DataFattura = null;
            //            m_lotto.NumFattura = null;
            //        }
            //        this.objectListView1.RefreshItem((OLVListItem)e.Item);
            //    }
            //}

            this.objectListView1.RefreshItem((OLVListItem)e.Item);
        }

        void objectListView1_CellEditStarting(object sender, CellEditEventArgs e)
        {
            if (e.Value == null)
            {
                Lotto l = (Lotto)e.RowObject;
                l.DataFattura = DateTime.Now.Date;
            }
        }

        void objectListView1_CellEditFinishing(object sender, CellEditEventArgs e)
        {
            if (e.Column.AspectName.Equals("PrezzoUnitario"))
            {
                ((Lotto)e.RowObject).PrezzoUnitario = (double)e.NewValue;

                if (((Lotto)e.RowObject).PrezzoUnitario == 0)
                {
                    ((Lotto)e.RowObject).NumFattura = string.Empty;
                    ((Lotto)e.RowObject).DataFattura = null;
                }
            }

            if (e.Column.AspectName.Equals("NumFattura"))
            {
                ((Lotto)e.RowObject).NumFattura = (string)e.NewValue;

                if (string.IsNullOrWhiteSpace((string)e.NewValue))
                {
                    ((Lotto)e.RowObject).DataFattura = null;
                }
            }

            if (e.Column.AspectName.Equals("DataFattura"))
            {
                if (!(string.IsNullOrEmpty(e.NewValue.ToString())))
                    ((Lotto)e.RowObject).DataFattura = (DateTime)e.NewValue;
                else
                    ((Lotto)e.RowObject).DataFattura = DateTime.Now;
            }

            this.objectListView1.RefreshItem(e.ListViewItem);

            e.ListViewItem.Checked = false;
            e.ListViewItem.Checked = true;
        }

        private void ClearTotali()
        {
            m_totXFamiglia.Clear();
            m_totaleAmministrazione.TotaleEuro = 0;
            m_totaleAmministrazione.TotaleKg = 0;

            Control c = null;
            foreach (FamigliaColore fc in m_elencoFamiglie)
            {
                c = this.Controls.Find(string.Format("lbl{0}Euro", fc.Descrizione), true).FirstOrDefault();
                if (c != null) ((Label)c).Text = "0";

                c = this.Controls.Find(string.Format("lbl{0}Kg", fc.Descrizione), true).FirstOrDefault();
                if (c != null) ((Label)c).Text = "0";
            }

            this.lblTotEuro.Text = "Euro: 0";
            this.lblTotKg.Text = "Kg.: 0";
        }

        private void AggiornaTotali(Lotto item, bool isChecked)
        {
            if (isChecked)
            {
                m_totaleAmministrazione.TotaleEuro += item.PrezzoUnitario * item.GiacenzaIniziale;
                m_totaleAmministrazione.TotaleKg += item.GiacenzaIniziale;

                CalcolaTotaliXFamiglia(item, true);
            }
            else
            {
                m_totaleAmministrazione.TotaleEuro -= item.PrezzoUnitario * item.GiacenzaIniziale; ;
                m_totaleAmministrazione.TotaleKg -= item.GiacenzaIniziale;

                CalcolaTotaliXFamiglia(item, false);
            }

            this.lblTotEuro.Text = string.Format("Euro:{0:C}", m_totaleAmministrazione.TotaleEuro);
            this.lblTotKg.Text = string.Format("Kg.:{0}", m_totaleAmministrazione.TotaleKg);
        }

        private void CalcolaTotaliXFamiglia(Lotto lotto, bool addValue)
        {
            ComposizioneColoreFacadeExt ccf = new ComposizioneColoreFacadeExt();
            string m_famiglia = ccf.GetFamiglieColoriAssociate(lotto.IDPolvere);

            if (m_famiglia != null)
                if (!m_totXFamiglia.ContainsKey(m_famiglia))
                {
                    m_totXFamiglia.Add(m_famiglia, new TotaleAmministrazione()
                    {
                        TotaleEuro = lotto.PrezzoUnitario * lotto.GiacenzaIniziale,
                        TotaleKg = lotto.GiacenzaIniziale
                    });
                }
                else
                {
                    if (addValue)
                    {
                        m_totXFamiglia[m_famiglia].TotaleEuro += lotto.PrezzoUnitario * lotto.GiacenzaIniziale;
                        m_totXFamiglia[m_famiglia].TotaleKg += lotto.GiacenzaIniziale;
                    }
                    else
                    {
                        m_totXFamiglia[m_famiglia].TotaleEuro -= lotto.PrezzoUnitario * lotto.GiacenzaIniziale;
                        m_totXFamiglia[m_famiglia].TotaleKg -= lotto.GiacenzaIniziale;
                    }
                }

            Control c = null;
            foreach (FamigliaColore fc in m_elencoFamiglie)
            {
                if (m_totXFamiglia.ContainsKey(fc.Descrizione))
                {
                    c = this.Controls.Find(string.Format("lbl{0}Euro", fc.Descrizione), true).FirstOrDefault();
                    ((Label)c).Text = string.Format("{0:C}", m_totXFamiglia[fc.Descrizione].TotaleEuro);

                    c = this.Controls.Find(string.Format("lbl{0}Kg", fc.Descrizione), true).FirstOrDefault();
                    ((Label)c).Text = m_totXFamiglia[fc.Descrizione].TotaleKg.ToString();
                }
            }

        }

        void Amministrazione2_CustomButtonClicked(object sender, CustomEventArgs<Lotto> e)
        {
            #region Annulla Associazione
            if (e.ButtonName.Equals("btnAnnullaAssociazione", StringComparison.InvariantCultureIgnoreCase))
            {
                if (this.objectListView1.CheckedItems.Count == 0)
                {
                    MessageBox.Show("Nessun elemento selezionato!", "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Question);
                    return;
                }

                if (MessageBox.Show("Stai per annullare l'associazione tra Fattura e DDT. Vuoi continuare ?",
                                    "Amministrazione", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    if (this.objectListView1.CheckedObjects.Count > 0)
                    {
                        try
                        {
                            LottoFacade lf = new LottoFacade();
                            lf.Transact(() =>
                            {
                                foreach (Lotto item in this.objectListView1.CheckedObjects)
                                {
                                    lf.CancellaAssociazione(item);
                                }
                            });

                            MessageBox.Show("Dati salvati correttamente !", "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Errore durante il salvataggio dei dati: " + ex.Message, "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        }

                        ClearTotali();

                        base.ClearControls(this.Controls);
                        this.Filter.FilterBag.LoadingMode = LottoLoadingModes.NotAssociated;
                        this.Filter.LoadingMode = LottoLoadingModes.NotAssociated;
                        ManageData();
                    }
                }
            }
            #endregion

            #region Salva
            if (e.ButtonName.Equals("btnSalva", StringComparison.InvariantCultureIgnoreCase))
            {
                if (this.objectListView1.CheckedObjects.Count == 0)
                {
                    MessageBox.Show("Selezionare almeno un DDT!", "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    return;
                }

                if (this.objectListView1.CheckedObjects.Count > 0)
                {
                    foreach (Lotto item in this.objectListView1.CheckedObjects)
                    //foreach (Lotto item in this.objectListView1.Items)
                    {
                        //if (item.PrezzoUnitario != 0 || (item.NumFattura!=null))
                        //{
                        if (item.PrezzoUnitario == 0)
                        {
                            MessageBox.Show(string.Format("Indicare il prezzo unitario per il ddt: {0} e la fattura: {1} !", item.NumDdt, item.NumFattura), "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                            return;
                        }

                        if (item.NumFattura == string.Empty || item.NumFattura == null)
                        {
                            if (dynNumFattura.Text == string.Empty)
                            {
                                MessageBox.Show(string.Format("Indicare il numero fattura per il ddt: {0} !", item.NumDdt), "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                                return;
                            }
                            else
                                item.NumFattura = dynNumFattura.Text;
                        }

                        if (item.DataFattura == null)
                        {
                            if (dynNumFattura.Text == string.Empty)
                            {
                                MessageBox.Show(string.Format("Indicare la data fattura per il ddt: {0} e la fattura: {1}  !", item.NumDdt, item.NumFattura), "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                                return;
                            }
                            else
                                item.DataFattura = dynDataFattura.Value;

                        }
                        //}
                    }
                }

                try
                {
                    LottoFacade m_lottoFacade = new LottoFacade();

                    using (TransactionScope transaction = new TransactionScope())
                    {
                        if (this.objectListView1.CheckedObjects.Count > 0)
                        {
                            foreach (Lotto item in this.objectListView1.CheckedObjects)
                            {
                                m_lottoFacade.UpdateFatturaInformations(item);
                            }

                            transaction.Complete();
                        }

                        MessageBox.Show("Dati salvati correttamente!", "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        if (MessageBox.Show("Vuoi stampare l'elenco dei lotti che hai associato a fattura ?", "Amministrazione",
                                            MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                        {
                            PrintData();
                        }

                        this.objectListView1.CheckedObjects = null;
                        base.ClearControls(this.Controls);

                        ClearTotali();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Errore durante il salvataggio dei dati: " + ex.Message, "Amministrazione", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }

                base.ClearControls(this.Controls);
                this.Filter.FilterBag.LoadingMode = LottoLoadingModes.NotAssociated;
                ManageData();
            }
            #endregion

            #region Stampa
            if (e.ButtonName.Equals("btnExportToExcel", StringComparison.InvariantCultureIgnoreCase))
            {
                ExportToExcel();
            }
            #endregion

            #region Seleziona/Deseleziona
            if (e.ButtonName.Equals("btnSeleziona", StringComparison.InvariantCultureIgnoreCase))
            {
                try
                {
                    this.GetCustomButton("btnSeleziona").Enabled = false;
                    this.GetCustomButton("btnDeseleziona").Enabled = false;

                    //this.objectListView1.CheckObjects(this.objectListView1.Items);

                    this.objectListView1.CheckedObjectsEnumerable = this.objectListView1.Objects;

                    //foreach (ListViewItem item in this.objectListView1.Items)
                    //{
                    //    item.Checked = true;
                    //}

                    ClearTotali();

                    foreach (Lotto l in this.objectListView1.CheckedObjects)
                    {
                        AggiornaTotali(l, true);
                    }

                    this.GetCustomButton("btnSeleziona").Enabled = true;
                    this.GetCustomButton("btnDeseleziona").Enabled = true;
                    //this.objectListView1.CheckObjects(this.objectListView1.Items);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            if (e.ButtonName.Equals("btnDeseleziona", StringComparison.InvariantCultureIgnoreCase))
            {
                try
                {
                    this.GetCustomButton("btnSeleziona").Enabled = false;
                    this.GetCustomButton("btnDeseleziona").Enabled = false;

                    this.objectListView1.CheckedObjects = null;

                    //foreach (ListViewItem item in this.objectListView1.Items)
                    //{
                    //    item.Checked = false;
                    //}

                    ClearTotali();

                    foreach (Lotto l in this.objectListView1.CheckedObjects)
                    {
                        AggiornaTotali(l, true);
                    }

                    this.GetCustomButton("btnSeleziona").Enabled = true;
                    this.GetCustomButton("btnDeseleziona").Enabled = true;
                    //this.objectListView1.UncheckObjects(this.objectListView1.Items);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            #endregion
        }

        private void ExportToExcel()
        {
            lf.RunAsync(() => GetDataToExport(), (result) => 
            {
                if (result != null)
                {
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.Filter = "Excel Files (.xls)|*.xls|All Files (*.*)|*.*";
                    sfd.FilterIndex = 1;
                    if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        string errorMessage = string.Empty;
                        if (((List<Lotto>)result).ToExcel(sfd.FileName, out errorMessage))
                        {
                            MessageBox.Show("Esportazione in Excel effettuata!", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show(string.Format("ATTENZIONE: Si è verificato un errore: {0}", errorMessage), "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Nessun dato da inviare in stampa.", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            });
        }

        private void PrintData()
        {
            List<TotaleAmministrazioneFamiglia> m_totaliXFamiglia2 = new List<TotaleAmministrazioneFamiglia>();
            foreach (string key in m_totXFamiglia.Keys)
            {
                TotaleAmministrazioneFamiglia taf = new TotaleAmministrazioneFamiglia();
                taf.Famiglia = key;
                taf.TotaleEuro = m_totXFamiglia[key].TotaleEuro;
                taf.TotaleKg = m_totXFamiglia[key].TotaleKg;

                m_totaliXFamiglia2.Add(taf);
            }

            // non posso passare direttamente una IList, quindi prepariamo una list<Lotti> con gli elementi
            // selezionati nella griglia...
            List<Lotto> m_lotti = new List<Lotto>();
            foreach (Lotto item in this.objectListView1.CheckedObjects)
            {
                m_lotti.Add(item);
            }

            // stampa della schermata di amministrazione (da sistemare)...
            Report51 ssa = new Report51(m_totaleAmministrazione,
                                        m_totaliXFamiglia2,
                                        m_lotti);

            ReportViewerDialog rvd = new ReportViewerDialog();
            rvd.Datasource = ssa;
            rvd.Report = "ReportAmministrazione";
            rvd.ShowReport();
        }

        void Anagrafica_ButtonClicked(object sender, CustomEventArgs<Lotto> e)
        {
            Lotto data = new Lotto();

            switch (e.Action)
            {
                case Actions.Cancel:
                    {
                        this.Filter.FilterBag.UseDates = false;
                        this.Filter.FilterBag.LoadingMode = LottoLoadingModes.NotAssociated;
                        ClearTotali();
                        ManageData();
                    }
                    break;
                case Actions.New:
                    {
                        LottoFacade m_lottoFacade = new LottoFacade();

                        if (this.objectListView1.CheckedObjects.Count > 0)
                        {
                            this.objectListView1.CheckedObjects = null;
                            base.ClearControls(this.Controls);
                        }

                        LoadData(false);
                    }
                    break;
                case Actions.Add:
                    {
                        LoadData(false);
                    }
                    break;
                case Actions.Modify:
                    {
                    }
                    break;
                case Actions.Delete:
                    {
                    }
                    break;
                default:
                    break;
            }
        }

        void Anagrafica_ItemSelected(object sender, CustomEventArgs<Lotto> e)
        {
            base.Current = e.Item;
        }

        private List<Lotto> GetDataToExport()
        {
            List<Lotto> retValue = null;

            retValue = (this.IsFiltering ? lf.GetLotti(this.Filter.FilterBag) : lf.GetLotti());

            return retValue;
        }

        private void LoadData(bool selectLast)
        {
            this.objectListView1.Items.Clear();

            lf.LoadAsync((result) =>
            {
                this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                this.objectListView1.SetObjects((List<Lotto>)result, true);
            });


            //pf.LoadAsync((result) =>
            //{
            //    this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
            //    this.objectListView1.SetObjects((List<Lotto>)result, true);
            //});
        }

        private void LoadData(FilterBase<Lotti> filter)
        {
            lf.RunAsync<List<Lotto>>(() => lf.GetLotti(filter), (result) =>
            {
                if (result != null)
                {
                    List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");

                    if (mmm != null)
                    {
                        foreach (Lotto l in (List<Lotto>)result)
                        {

                            l.Famiglia = mmm.Find(x => x.IDPolvere == l.IDPolvere).Famiglia;
                        }
                    }

                    this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                    this.objectListView1.SetObjects((List<Lotto>)result, true);
                }
            });

            //pf.RunAsync<List<Lotto>>(() => pf.GetLotti(filter), (result) =>
            //{
            //    if (result != null)
            //    {
            //        foreach (Lotto l in (List<Lotto>)result)
            //        {
            //            List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");

            //            l.Famiglia = mmm.Find(x => x.IDPolvere == l.IDPolvere).Famiglia;
            //        }

            //        this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
            //        this.objectListView1.SetObjects((List<Lotto>)result, true);
            //    }
            //});
        }

        private void LoadFamiglie()
        {
            FamigliaColoriFacade pf = new FamigliaColoriFacade();

            pf.LoadAsync((result) =>
            {
                m_elencoFamiglie = new List<FamigliaColore>((IList<FamigliaColore>)result);
            });
        }

        public override void OnRipristinaConfigurazioneDefaultMaschera()
        {
            base.OnRipristinaConfigurazioneDefaultMaschera();
        }

        public override void OnSalvaConfigurazioneMaschera()
        {

            base.OnSalvaConfigurazioneMaschera();

            byte[] data = this.objectListView1.SaveState();

            System.Security.Principal.IPrincipal m_operatore = System.Threading.Thread.CurrentPrincipal;
            string[] roles = System.Web.Security.Roles.GetRolesForUser(m_operatore.Identity.Name);

            SavingConfigurationBag scb = new SavingConfigurationBag();
            scb.FormName = this.Name;
            scb.RoleName = roles[0];
            //scb.UserName = m_operatore.Identity.Name;

            ColumnsConfigurationManager ccm = new ColumnsConfigurationManager();
            ccm.Configuration = scb;
            ccm.State = data;
            ccm.SaveState();
        }

        private void RefreshColumns()
        {
            ColumnsConfigurationManager ccm = new ColumnsConfigurationManager();
            byte[] state = ccm.GetState(this.Name);

            if (state != null)
            {
                bool result = this.objectListView1.RestoreState(state);
            }
        }
    }

    public class AmministrazioneBaseExt : AnagraficaManagerFilteredObjectListView<Lotto, AmministrazioneFilter, AmministrazioneFilterBag> { }

    //public class AmministrazioneBaseExt : AnagraficaManagerObjectListView2<Lotto> { }
}
